// handlers/submitHandler.js
const { buildTask } = require('../core/workflowService');
const { addTaskRecord, updateTaskExecuteInfo, updateTaskStatus} = require('../core/databaseService');
const { consumePoints, checkUserPoints } = require('../core/pointsService');
const { submitWorkflow } = require('../core/cozeClient');
const { getShortTermMonitor } = require('../monitors/ShortTermMonitor');

async function handle(event, OPENID) {
  const {
    action,
    data,
    taskData,
    ...restParams
  } = event;

  const submitData = data || taskData;
  const userId = event.userId || OPENID;

  // const { data, taskData } = event;
  // const userId = event.userId || context.OPENID;
  // const submitData = data || taskData || {};

  const task = buildTask(submitData, userId);

  try {
    // 1. 验证用户积分
    const checkResult = await checkUserPoints(userId, task);
    if (!checkResult.success) {
      return checkResult; // 统一返回错误信息
    }

    // 2. 数据库记录任务
    await addTaskRecord(task);

    // 3. 异步提交Coze任务
    const taskId = task.taskId;
    
    setImmediate(async () => {
      try {
        const workflowResponse = await submitWorkflow(task.workflowId, task.parameters, task.taskType);

        if (workflowResponse?.execute_id) {
          // 3.1 如果返回 execute ID , 更新数据库
          await updateTaskExecuteInfo(taskId,workflowResponse.execute_id,workflowResponse.debug_url);

          // 3.2 获得 executeId 后立即扣除积分，防止用户利用时间差刷量
          // 重试时不会再次扣除（因为已经扣过了）
          try{
            await consumePoints(userId, task.requiredPoints, task.taskType, task.taskId);
            // 标记积分已扣除
            await updateTaskStatus(taskId, 'running', {}, { pointsDeducted: true });
          }catch (pointsError) {
            console.error('扣除积分失败:', pointsError);
          }

          // 3.3 启动短期监控（仅在云函数实例存活期间有效，通常 1-2 分钟）
          // 注意：云函数不是常驻进程，监控会随实例销毁而停止
          // 主要依靠定时触发器（每分钟）进行持续监控
          const shortTermMonitor = getShortTermMonitor();
          shortTermMonitor.start(taskId);
          
        } else {
          throw new Error('工作流返回无效：没有执行ID');
        }
      } catch (error) {

        // 3.4 没有返回执行ID， 更新数据库为失败
        console.error('异步提交失败:', error);
        await updateTaskStatus(taskId, 'failed', { error: error.message });

      }
    });

    return {
      success: true,
      data: { taskId, status: 'running' }
    };

  } catch (error) {
    console.error('提交任务失败:', error);
    return { success: false, error: error.message };
  }
}

module.exports = handle;
